/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.analisador;

import compilador.arquivo.Variavel;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;

/**
 *
 * @author Gustavo
 */
public class DescricaoRegular {

//    LinkedList tokens;
//    ArrayList<Integer> Linhas;
    HashMap<Integer, Token> tokens = null;
    ArrayList<Variavel> variaveis=new ArrayList<Variavel>();

//    public DescricaoRegular(LinkedList tokens, ArrayList<Integer> Linhas)
//    {
//        this.tokens=tokens;
//        this.Linhas=Linhas;
//    }

    public DescricaoRegular(HashMap<Integer, Token> tokens) {
        this.tokens = tokens;
    }
    
    public ArrayList<Variavel> descricao()
    {
        int i=0,lin=0;
        String x=null;
        Variavel var;
//        while (this.tokens.get(i)!= this.tokens.getLast())
        while (this.tokens.get(i).getToken()!= this.tokens.get(i-1).getToken())
        {
//            x=(String) this.tokens.get(i);
            x = this.tokens.get(i).getToken(); 
            //System.out.println(tokens.get(i));
            if (ehReservada(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("reservada");
                this.variaveis.add(var);
            }
            else if(ehComando(x) == 1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("comando");
                this.variaveis.add(var);
            }
            else if (ehPalavra(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("palavra");
                this.variaveis.add(var);
            }
            else if (ehInteiro(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("inteiro");
                this.variaveis.add(var);
            } else  if (ehOperadorSeparador(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("operadorseparador");
                this.variaveis.add(var);
            } else if(ehIdentificador(x) == 1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("identificador");
                this.variaveis.add(var);
            }
             if (ehErro(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("erro");
                this.variaveis.add(var);
            }
            i++;
        }
//        x=(String) this.tokens.get(i);
        x = this.tokens.get(i).getToken(); 
            //System.out.println(tokens.get(i));
            if (ehReservada(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("reservada");
                this.variaveis.add(var);
            }
            else if(ehComando(x) == 1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("comando");
                this.variaveis.add(var);
            }
            else if (ehPalavra(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("palavra");
                this.variaveis.add(var);
            }
            else if (ehInteiro(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("inteiro");
                this.variaveis.add(var);
            } else  if (ehOperadorSeparador(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("operadorseparador");
                this.variaveis.add(var);
            } else if(ehIdentificador(x) == 1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("identificador");
                this.variaveis.add(var);
            }
            if (ehErro(x)==1)
            {
//                lin=this.Linhas.get(i);
                lin = this.tokens.get(i).getLineNum();
                var=new Variavel();
                var.setNome(x);
                var.setLinha(lin);
                var.setTipo("erro");
                this.variaveis.add(var);
            }
        return this.variaveis;
    }

    public int ehReservada(String x)
    {
        Simbolos simb=new Simbolos();
        int i=simb.compareToSimbolo(x);
        if (i==1) return 1;
        return 0;
    }

    public int ehIdentificador(String x)
    {
        Simbolos simb=new Simbolos();
        int i=simb.compareToIdentificador(x);
        if (i==1) return 1;
        return 0;
    }

    public int ehPalavra(String x)
    {
        Simbolos simb=new Simbolos();
        int i=simb.compareToPalavra(x);
        if (i==1) return 1;
        return 0;
    }

    public int ehInteiro(String x)
    {
        Simbolos simb=new Simbolos();
        int i=simb.compareToInteiro(x);
        if (i==1) return 1;
        return 0;
    }

    public int ehOperadorSeparador(String x)
    {
        Simbolos simb=new Simbolos();
        int i=simb.compareToOpSep(x);
        if (i==1) return 1;
        return 0;
    }

    public int ehErro(String x)
    {
        return 0;
    }

    public int ehComando(String x)
    {
        Simbolos simb=new Simbolos();
        int i=simb.compareToComando(x);
        if (i==1) return 1;
        return 0;
    }

}
